/**
 * Created by 2015/10/22.
 * Copyright (c) 2015 
 * Version : 3.1 
 */
 
/************************************************************************************************************************************/
/****************************************************** SDK 接口方法定义 START ******************************************************/
/************************************************************************************************************************************/
var yunSDKObj = null;			 // SDK插件对象
var isInitialize = false;        // 是否初始化
var isSupportActive = false;	// 是否支持Active插件
var classidForWebPlugin = "clsid:638ABEBA-E88E-40E3-97A5-B838261083FB";   // 主控件的classid
var classidForVideoShowPlugin = "clsid:AC5D1CA6-9628-4D94-BEAD-E7EF79348163";   // 显示控件的classid

/****************************************************** 1.SDK初始化模块 START ******************************************************/
/**
/* Description:                 初始化SDK
/* param[flags(number)]:        初始化参数（暂保留）
/* param[strParams(string)]:    初始化参数（暂保留)
/* return[number]:				0:成功 非0:失败
*/
function Yun_Initialize(flags, strParams) {
    flags = flags || 0;
    strParams = strParams || ''; 
    if (isInitialize){
        return 0;
    }

    // 判断是否支持插件
    isSupportActive = (function(){
        return (window.ActiveXObject || "ActiveXObject" in window);
    })();

    if (!isSupportActive){
        return YUN_NOTSUPPORT_SDKPLUGIN;
    }

    // 注册SDK控件
    try{
        // 主控件
        var sdkObj = document.createElement("object");
        sdkObj.classid = classidForWebPlugin;
        sdkObj.id = 'YunMediaSDKWebPlugin';

        var idiv = document.createElement("div");
	    idiv.id = "YunMediaSDKWebPluginDiv";
		idiv.appendChild(sdkObj);
	    document.body.appendChild(idiv);
		sdkObj.width = "1 px";
        sdkObj.height = "1 px";
        
        var sdkVersion = sdkObj.GetSDKVersion();
        if (!sdkVersion){
            return YUN_NOTVERSION_SDKPLUGIN;
        }
        
        // 显示控件
        var videoshowObj = document.createElement("object");
        videoshowObj.classid = classidForVideoShowPlugin;
        videoshowObj.id = 'yunVideoShowCtrl';
        videoshowObj.width = '0px';
        videoshowObj.height = '0px';

        yunSDKObj = sdkObj;
        if (YunUtils.isFunction(onYunLoginSystem))
            doRegisterCallBack(yunSDKObj, "OnLoginSystem", onYunLoginSystem);
        if (YunUtils.isFunction(onYunDisConnect))
            doRegisterCallBack(yunSDKObj, "OnDisConnect", onYunDisConnect);
        if (YunUtils.isFunction(onYunServerTickout))
            doRegisterCallBack(yunSDKObj, "OnServerTickout", onYunServerTickout);
        if (YunUtils.isFunction(onYunConferenceResult))
            doRegisterCallBack(yunSDKObj, "OnConferenceResult", onYunConferenceResult);
        if (YunUtils.isFunction(onYunConferenceUser))
            doRegisterCallBack(yunSDKObj, "OnConferenceUser", onYunConferenceUser);
        if (YunUtils.isFunction(onYunRecordResult))
            doRegisterCallBack(yunSDKObj, "OnRecordResult", onYunRecordResult);
        if (YunUtils.isFunction(onYunSnapShotResult))
            doRegisterCallBack(yunSDKObj, "OnSnapShotResult", onYunSnapShotResult);
        if (YunUtils.isFunction(onYunSendFileStatus))
            doRegisterCallBack(yunSDKObj, "OnSendFileStatus", onYunSendFileStatus);
        if (YunUtils.isFunction(onYunReceiveMessage))
            doRegisterCallBack(yunSDKObj, "OnReceiveMessage", onYunReceiveMessage);
        if (YunUtils.isFunction(onYunMediaSourceEvent))
            doRegisterCallBack(yunSDKObj, "OnMediaSourceEvent", onYunMediaSourceEvent);
        if (YunUtils.isFunction(onYunHTTPDownloadStatus))
            doRegisterCallBack(yunSDKObj, "OnHTTPDownloadStatus", onYunHTTPDownloadStatus);
        var ret = yunSDKObj.Initialize(0, '');
        if (ret == 0)
            isInitialize = true; 
        console.log("yunSDK Initialize=" + ret);
        return ret;
    }
    catch (e){
        console.log("yunSDK Initialize, catch exception=" + e);
        return YUN_NOTINSTALL_SDKPLUGIN;
    }
}

/**
/* Description:	获取版本/编译信息
/* return[string]:	返回版本号+编译时间，json格式，(eg. {"version":"V1.0.1", "build":"2015-10-31 12:04:40"})， 为空则表示失败！
*/
function Yun_GetSDKVersion() {
    if (!isInitialize)
        return '';
    return yunSDKObj.GetSDKVersion();
}

/**
/* Description:		设置日志输出级别
/* param[logLevel(number)]	日志级别（值越低越详细）
/* param[logFlags(number)]	日志标记，特别过滤标记
/* return[number]			0:成功 非0:失败
*/
function Yun_SetLogLevel(logLevel, logFlags) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SetLogLevel(logLevel, logFlags);
}

/****************************************************** 1.SDK初始化模块 END ******************************************************/


/****************************************************** 2.登录连接模块 START ******************************************************/
/**
/* Description:	登录系统
/* param[serverEndpoints(string)]	连接服务器地址，格式："192.168.1.20:9600"
/* param[userCode(string)]			用户ID（字符串），若该字段为NULL或者""则由服务器分配唯一用户ID，最大长度100字节
/* param[nickName(string)]			用户昵称，最大长度100字节
/* param[timeoutMS(number)]			登录超时值，单位：毫秒，若为0则为异步请求
/* param[appId(string)]				应用渠道ID，目前为NULL
/* param[signTimeStamp(number)]		签名数据有效期，由签名认证服务器返回
/* param[signStr(string)]			签名数据串
/* param[params(string)]			保留字符串
/* return[number]				    0:成功 非0:失败
*/
function Yun_Login(serverEndpoints, userCode, nickName, timeoutMS, appId, signTimeStamp, signStr, params) {
    serverEndpoints = serverEndpoints || '';
    userCode = userCode || '';
    nickName = nickName || '';
    timeoutMS = timeoutMS || 0;
    appId = appId || '';
    signTimeStamp = signTimeStamp || 0;
    signStr = signStr || '';
    params = params || '';
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.Login(serverEndpoints, userCode, nickName, timeoutMS, appId, signTimeStamp, signStr, params);
}

/**
/* Description:	    注销系统
/* return[number]	0:成功 非0:失败
*/
function Yun_Logout() {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.Logout();
}
/****************************************************** 2.登录连接模块 END ******************************************************/


/**************************************************** 3.会议（房间）模块 START ***************************************************/
/**
/* Description:	加入会议
/* param[confId(string)]	会议ID，最大长度100字节
/* param[password(string)]	密码，最大长度100字节
/* param[params(string)]	保留参数
/* return[number]	        0:成功 非0:失败
*/
function Yun_JoinConference(confId, password, params) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.JoinConference(confId, password, params);
}

/**
/* Description:	退出会议
/* param[confId(string)]	confId: 会议ID
/* return[number]	        0:成功 非0:失败
*/
function Yun_ExitConference(confId) {
    confId = confId || '';
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.ExitConference(confId);
}

/**
/* Description:	获取会议参会人数
/* param[confId(string)]	confId: 会议ID
/* return[number]	        >=0:成功 <0:失败
*/
function Yun_GetConferenceUsers(confId) {
    confId = confId || '';
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.GetConferenceUsers(confId);
}
/**************************************************** 3.会议（房间）模块 END ***************************************************/

/**************************************************** 4.音视频通信模块 START ***************************************************/
/**
/* Description:	获取设备数量
/* param[deviceType(number)]	设备类型，参考YunSDKDefine.js(1:视频采集设备 2:音频采集设备 3:音频播放设备)
/* return[number]	            >=0:成功, <0:失败
*/
function Yun_GetDeviceCount(deviceType) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.GetDeviceCount(deviceType);
}

/**
/* Description:	获取设备名称
/* param[deviceType(number)]	设备类型，参考YunSDKDefine.js(1:视频采集设备 2:音频采集设备 3:音频播放设备)
/* param[deviceIndex(number)]	设备序号，从 0 到 GetDeviceCount-1 
/* return[string]	            返回设备名称，若为空则获取失败
*/
function Yun_GetDeviceName(deviceType, deviceIndex) {
    if (!isInitialize)
        return '';
    return yunSDKObj.GetDeviceName(deviceType, deviceIndex);
}

/**
/* Description:	打开摄像头
/* param[deviceIndex(number)]       设备序号，Yun_GetDeviceCount()序号一一对应，从0开始（单个摄像头时为0即可）
/* param[channelIndex(number)]	    视频通道号，表示这个流是第几号流，从0开始
/* return[number]	                0:成功 非0:失败
*/
function Yun_OpenCamera(deviceIndex, channelIndex) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.OpenCamera(deviceIndex, channelIndex);
}

/**
/* Description:	关闭摄像头
/* param[deviceIndex(number)]	    设备序号，单个摄像头时为0即可
/* return[number]	                0:成功 非0:失败
*/
function Yun_CloseCamera(deviceIndex) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.CloseCamera(deviceIndex);
}

/**
/* Description:	打开麦克风
/* param[deviceIndex(number)]       设备序号，Yun_GetDeviceCount()序号一一对应，从0开始（单个麦克风时为0即可）
/* param[channelIndex(number)]	    视频通道号，表示这个流是第几号流，从0开始
/* return[number]	                0:成功 非0:失败
*/
function Yun_OpenMicrophone(deviceIndex, channelIndex) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.OpenMicrophone(deviceIndex, channelIndex);
}

/**
/* Description:	关闭麦克风
/* param[deviceIndex(number)]	    设备序号，单个麦克风时为0即可
/* return[number]	                0:成功 非0:失败
*/
function Yun_CloseMicrophone(deviceIndex) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.CloseMicrophone(deviceIndex);
}

/**
/* Description:	请求远程视频流
/* param[userCode(string)]	        用户ID（字符串），最大长度100字节
/* param[channelIndex(number)]	    视频通道号
/* param[params(string)]	        保留参数
/* return[number]	                0:成功 非0:失败
*/
function Yun_GetRemoteVideoStream(userCode, channelIndex, params) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.GetRemoteVideoStream(userCode, channelIndex, params);
}

/**
/* Description:	请求远程音频流
/* param[userCode(string)]	        用户ID（字符串），最大长度100字节
/* param[channelIndex(number)]	    音频通道号
/* param[params(string)]	        保留参数
/* return[number]	                0:成功 非0:失败
*/
function Yun_GetRemoteAudioStream(userCode, channelIndex, params) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.GetRemoteAudioStream(userCode, channelIndex, params);
}

/**
/* Description:	显示视频
/* param[userCode(string)]	        用户ID（字符串），最大长度100字节
/* param[channelIndex(number)]	    视频通道号
/* param[parentobj(DMO对象)]          显示的DMO对象
/* param[objectid(id)]	            id值
*/
function Yun_ShowVideo(userCode, channelIndex, parentobj, objectid) {
    if (!isInitialize)
        return;

    try {
        var yunShowCtrl = YunUtils.GetDmoObject(objectid);
        if (yunShowCtrl != null) {
            yunShowCtrl.BindingShowVideo(userCode, channelIndex);
            yunShowCtrl.SetIPCId(yunSDKObj.GetIPCId());
        } else {
            // 创建视频显示插件
            yunShowCtrl = document.createElement("object")
            if (window.ActiveXObject || "ActiveXObject" in window)
                yunShowCtrl.classid = classidForVideoShowPlugin;
            yunShowCtrl.id = objectid;
            parentobj.appendChild(yunShowCtrl);
            yunShowCtrl.width = "100%";
            yunShowCtrl.height = "100%";
            yunShowCtrl.BindingShowVideo(userCode, channelIndex);
            yunShowCtrl.SetIPCId(yunSDKObj.GetIPCId());
        }
    } catch (e) {
        console.log("CreateVideoPlugin function has exception：" + e);
    }
}

/**
/* Description:	取消(挂断)远程视频流
/* param[userCode(string)]	        用户ID（字符串），最大长度100字节
/* param[channelIndex(number)]	    视频通道号
/* param[params(string)]	        保留参数
/* return[number]	                0:成功 非0:失败
*/
function Yun_CancelRemoteVideoStream(userCode, channelIndex, params) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.CancelRemoteVideoStream(userCode, channelIndex, params);
}

/**
/* Description:	取消(挂断)远程音频流
/* param[userCode(string)]	        用户ID（字符串），最大长度100字节
/* param[channelIndex(number)]	    音频通道号
/* param[params(string)]	        保留参数
/* return[number]	                0:成功 非0:失败
*/
function Yun_CancelRemoteAudioStream(userCode, channelIndex, params) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.CancelRemoteAudioStream(userCode, channelIndex, params);
}

/**
/* Description:	设置视频分辨率
/* param[channelIndex(number)]	    视频通道号
/* param[width(number)]	            视频分辨率-宽度
/* param[height(number)]	        视频分辨率-高度
/* return[number]	                0:成功 非0:失败
*/
function Yun_SetVideoResolution(channelIndex, width, height) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SetVideoResolution(channelIndex, width, height);
}

/**
/* Description:	设置视频帧率
/* param[channelIndex(number)]	视频通道号
/* param[fps(number)]	        iFps:帧率
/* return[number]	            0:成功 非0:失败
*/
function Yun_SetVideoFps(channelIndex, fps) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SetVideoFps(channelIndex, fps);
}

/**
/* Description:	设置视频码率
/* param[channelIndex(number)]	    视频通道号
/* param[bitrate(number)]	        码率,单位:kbps (为0时，代表动态调节)
/* return[number]	                0:成功 非0:失败
*/
function Yun_SetVideoBitrate(channelIndex, bitrate) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SetVideoBitrate(channelIndex, bitrate)
}

/**
/* Description:	设置视频参数生效(更新的视频参数，必须调用此接口才会生效)
/* param[channelIndex(number)]	    视频通道号
/* return[number]	                0:成功 非0:失败
*/
function Yun_SetVideoApplyParam(channelIndex) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SetVideoApplyParam(channelIndex);
}

/**
/* Description:	设置视频参数（通用接口，扩展使用）
/* param[channelIndex(number)]	    视频通道号
/* param[jsonParams(string)]	    json格式字符串 (eg. {"width":640, "height":480, "fps":15, "bitrate":400} )
/* return[number]	                0:成功 非0:失败
*/
function Yun_SetVideoParam(channelIndex, jsonParams){
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SetVideoParam(channelIndex, jsonParams);
}

/**
/* Description:	获取视频参数
/* param[channelIndex(number)]  视频通道号
/* return[string]	            非空则返回json格式字符串，否则获取失败 (eg. {"width":640, "height":480, "fps":15, "bitrate":400} )
*/
function Yun_GetVideoParam(channelIndex){
    if (!isInitialize)
        return '';
    return yunSDKObj.GetVideoParam(channelIndex);
}

/**
/* Description:	打开关闭视频时间戳水印（调用立即生效）
/* param[channelIndex(number)]	    视频通道号
/* param[isOpen(number)]		    isOpen : 是否打开时间戳水印,0关闭，1打开
/* return[number]	                0:成功 非0:失败
*/
function Yun_SetVideoTimestamp(channelIndex, isOpen) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SetVideoTimestamp(channelIndex, isOpen);
}

/**************************************************** 4.音视频通信模块 END *****************************************************/

/**************************************************** 5.录像拍照模块 START *****************************************************/
/**
/* Description:	设置全局录制保存路径
/* param[filePath(string)]	录像保存路径，最大长度255
/* return[number]	        0:成功 非0:失败
*/
function Yun_SetRecordPath(filePath) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SetRecordPath(filePath);
}

/**
/* Description:	开始录像
/* param[flags(number)]	        录像标记，保留
/* param[recordParams(string)]	录像参数定义，参考YunSDKDefine.js
/* return[number]	            返回操作句柄，>0:成功(录像句柄) <0:失败
*/
function Yun_StartRecord(flags, recordParams) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.StartRecord(flags, recordParams);
}

/**
/* Description:	停止录像
/* param[handle(number)]	录像句柄(由 StartRecord() 返回)
/* return[number]	        0:成功 非0:失败
*/
function Yun_StopRecord(handle) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.StopRecord(handle);
}

/**
/* Description:	插入图片录像
/* param[handle(number)]	    录像句柄(由 StartRecord() 返回)
/* param[channelIndex(number)]	通道号
/* param[fileName(sting)]	    图片路径
/* param[imageParam(string)]	图片参数定义，保留
/* return[number]	            0:成功 非0:失败
*/
function  Yun_InsertImage2Record(handle, channelIndex, fileName, imageParam) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.InsertImage2Record(handle, channelIndex, fileName, imageParam);
}

/**
/* Description:	拍照
/* param[flags(number)]	        快照标记，保留
/* param[snapParams(string)]	快照自定义参数
/* return[number]	            0:成功 非0:失败
*/
function Yun_Snapshot(flags, snapParams) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.Snapshot(flags, snapParams);
}
/**************************************************** 5.录像拍照模块 END *****************************************************/

/**************************************************** 6.文件传输模块 BEGIN *****************************************************/
/**
/* Description:	发送文件 to 用户
/* param[userCode(string)]	    用户ID（字符串），最大长度100字节
/* param[filePath(string)]	    文件的绝对路径(最大长度255)
/* param[speed(number)]	        发送速度，限速使用，单位Kbps，-1表示不限速
/* param[params(string)]	    保留参数
/* return[number]	            返回操作句柄，>0:成功(返回句柄) <0:失败
*/
function Yun_SendFile(userCode, filePath, speed, params) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SendFile(userCode, filePath, speed, params);
}

/**
/* Description:	发送文件 to 服务器
/* param[filePath(string)]	    文件的绝对路径(最大长度255)
/* param[speed(number)]	        发送速度，限速使用，单位Kbps，-1表示不限速
/* param[params(string)]	    保留参数
/* return[number]	            返回操作句柄，>0:成功(返回句柄) <0:失败
*/
function Yun_SendFile2Server(filePath, speed, params) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SendFile2Server(filePath, speed, params);
}

/**
/* Description:	发送文件控制(整形值)
/* param[handle(number)]	    发送句柄(由 Yun_SendFile2Server() 或 Yun_SendFile() 返回)
/* param[ctrlCode(number)]	    发送控制代码，参考YunSDKDefine.js ，比如：YUN_DEF_SENDFILE_CTRLCODE_PAUSE...
/* param[ctrlVal(number)]	    控制代码具体内容
/* return[number]	            0:成功 非0:失败
*/
function Yun_SendFileControlInt(handle, ctrlCode, ctrlVal) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SendFileControlInt(handle, ctrlCode, ctrlVal);
}

/**
/* Description:	发送文件控制(字符串)
/* param[handle(number)]	    发送句柄(由 Yun_SendFile2Server() 或 Yun_SendFile() 返回)
/* param[ctrlCode(number)]	    发送控制代码，参考YunSDKDefine.js ，比如：YUN_DEF_SENDFILE_CTRLCODE_XXXX...
/* param[strCtrlVal(string)]	控制代码具体内容
/* return[LONG]	                0:成功 非0:失败
*/
function Yun_SendFileControlString(handle, ctrlCode, strCtrlVal) {
    if (!isInitialize)
        return '';
    return yunSDKObj.SendFileControlString(handle, ctrlCode, strCtrlVal);
}
/**************************************************** 6.文件传输模块 END *****************************************************/

/**************************************************** 7.即时通讯模块 START ****************************************************/
/**
/* Description:	指定用户发送消息
/* param[userCode(string)]	用户ID（字符串），最大长度100字节
/* param[message(string)]	消息内容
/* return[number]	        0:成功 非0:失败
*/
function Yun_SendMessage(userCode, message) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SendMessage(userCode, message);
}

/**
/* Description:	指定会议房间发送消息（会议内广播）
/* param[confId(string)]	会议号
/* param[message(string)]	消息内容
/* return[number]	        0:成功 非0:失败
*/
function Yun_SendMessageByConf(confId, message) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SendMessageByConf(confId, message);
}
/**************************************************** 7.即时通讯模块 END ****************************************************/

/*************************************************** 8.外部媒体输入源模块 START **********************************************/
/**
/* Description:	设置文件媒体输入源
/* param[channelIndex(number)]	媒体流通道号, 外部媒体输入源的通道号从100开始
/* param[fileName(string)]	    文件绝对路径
/* param[flags(number)]	        保留参数
/* param[params(string)]	    保留参数
/* return[string]               返回操作句柄，>0:成功(返回句柄) <0:失败
*/
function Yun_SetMediaSourceFile(channelIndex, fileName, flags, params) {
    if (!isInitialize)
        return '';
    return yunSDKObj.SetMediaSourceFile(channelIndex, fileName, flags, params);
}

/**
/* Description:	获取文件媒体输入源信息(整形)
/* param[handle(number)]	    操作句柄，由( SetMediaSourceFile() 返回 )
/* param[infoType(number)]	    信息类型，参考YunSDKDefine.js， 比如：YUN_MEDIAINFO_PLAYTIME
/* return[number]	            0:成功 非0:失败
*/
function Yun_GetMediaSourceInfoInt(handle, infoType) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.GetMediaSourceInfoInt(handle, infoType);
}

/**
/* Description:	获取文件媒体输入源信息(字符串)
/* param[handle(number)]	        操作句柄，由( SetMediaSourceFile() 返回 )
/* param[infoType(number)]	        信息类型，参考YunSDKDefine.js， 比如：YUN_MEDIAINFO_PLAYTIME
/* return[string]	                json数据
*/
function Yun_GetMediaSourceInfoString(handle, infoType) {
    if (!isInitialize)
        return '';
    return yunSDKObj.GetMediaSourceInfoString(handle, infoType);
}

/**
/* Description:	文件媒体输入源控制（开始播放、暂停、停止、跳转）
/* param[handle(number)]	    操作句柄，由( SetMediaSourceFile() 返回 )
/* param[ctrlCode(number)]	    操作码，参考YunSDKDefine.js， 比如：YUN_DEF_MEDIASOURCE_CTRLCODE_OPEN
/* param[flags(number)]	        操作标记(当 ctrlCode = YUN_MEDIASOURCE_CTRLCODE_YUNK 时，此参数为跳转的时间点，单位：秒 )
/* param[params(string)]	    保留参数
/* return[number]	            0:成功 非0:失败
*/
function Yun_MediaSourceControl(handle, ctrlCode, flags, params) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.MediaSourceControl(handle, ctrlCode, flags, params);
}

/**
/* Description:	销毁输入源
/* param[handle(number)]	操作句柄，由( SetMediaSourceFile() 返回 )
/* param[flags(number)]	    保留参数
/* param[params(string)]	保留参数
/* return[number]	        0:成功 非0:失败
*/
function Yun_DestoryMediaSource(handle, flags, params) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.DestoryMediaSource(handle, flags, params);
}
/*************************************************** 8.外部媒体输入源模块 END **********************************************/

/************************************************* 9.Web服务模块 BEGIN ***************************************************/
/**
/* Description:	        开启Web服务
/* return[number]	 0:成功 非0:失败
*/
function Yun_StartWebService() {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.StartWebService();
}

/**
/* Description:	            获取本地文件的URL
/* param[filePath(string)]	本地文件路径
/* return[string]	        非空则执行正常，否则执行失败
*/
function Yun_GetWebServiceUrl(filePath) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.GetWebServiceUrl(filePath);
}
/************************************************* 9.Web服务模块 BEGIN  *****************************************************/

/************************************************* 10.HTTP下载模块 END  *****************************************************/

/**
/* Description:	            设置下载保存目录
/* param[path(string)]	    本地保存路径
/* param[flags(number)]	    保留
/* param[param(string)]	    保留
/* return[number]	        0:成功 非0:失败      
*/
function Yun_SetDownloadPath(path, flags, param) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.SetDownloadPath(path, flags, param);
}

/**
/* Description:	            下载HTTP文件
param[guid(string)]	        下载文件GUID（业务层指定，可与上层业务系统关联）
param[url(string)]	        HTTP下载URL
param[md5(string)]	        文件的MD5，每次许执行文件下载任务时，跟根据传入的GUID在下载的目录中查找，如果传入的MD5值与本地相同GUID的文件一致，则不会再触发下载
param[param(string)]	    下载文件GUID（可与上层业务系统关联）
/* return[number]	        0:成功 非0:失败      
*/
function Yun_HTTPDownload(guid, url, md5, param) {
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.HTTPDownload(guid, url, md5, param);
}

/************************************************* 10.HTTP下载模块 END  *****************************************************/


/************************************************* 20.其他独立接口 BEGIN ***************************************************/
/* Description:	获取IPC通讯GUID(插件sdk内部使用)
/* return[string]	非空则执行正常，否则执行失败
*/
function Yun_GetIPCId(){
    if (!isInitialize)
        return YUN_NOTINIT_SDKPLUGIN;
    return yunSDKObj.GetIPCId();
}
/************************************************* 20.其他独立接口 END  *****************************************************/


/****************************************************** 工具类定义 START ******************************************************/
//Tools
var boolClass = '[object Boolean]';
var toString = {}.toString;
var YunUtils = {
    /**
     * 判断是否布尔值
     * /* param value [*] 需判断的值
     * /* returns Boolean
     * */
    isBoolean : function(value){
        return value === true || value === false || toString.call(value) == boolClass;
    },
    /**
     * 判断是否函数
     * /* param obj [*] 需判断的值
     * /* returns Boolean
     * */
    isFunction : function(obj) {
        return typeof obj == 'function' || false;
    },

    // 获取Web DMO对象
    GetDmoObject : function(id) {
        if (document.getElementById) {
            return document.getElementById(id);
        } else if (window[id]) {
            return window[id];
        }
        return null;
    },
}

 // 注册回调事件
function doRegisterCallBack(obj, name, proc) {
    if (!YunUtils.isFunction(proc))
        return;
    if(window.ActiveXObject || "ActiveXObject" in window) {
        if(window.ActiveXObject && obj.attachEvent) {
            obj.attachEvent(name, proc);
        } else {
            doAttachIE11Event(obj, name, proc);
        }
    } else {
        obj[name] = proc;
    }
}

function doAttachIE11Event(obj, strEventId, functionCallback) {
    var nameFromToStringRegex = /^function\s?([^\s(]*)/;
    var paramsFromToStringRegex = /\(\)|\(.+\)/;
    var params = functionCallback.toString().match(paramsFromToStringRegex)[0];
    var functionName = functionCallback.name || functionCallback.toString().match(nameFromToStringRegex)[1];
    var handler;
    try {
        handler = document.createElement("script");
        handler.setAttribute("for", obj.id);
    } catch(ex) {
        handler = document.createElement('<script for="' + obj.id + '">');
    }
    handler.event = strEventId + params;
    handler.appendChild(document.createTextNode(functionName + params + ";"));
    document.body.appendChild(handler);
}

/****************************************************** 工具类定义 END ******************************************************/

/*********************************************************************************************************************************/
/****************************************************** SDK 接口方法定义 END ******************************************************/
/*********************************************************************************************************************************/
